Exercise 1: plotly
First generate the following (x,y,z) coordinates for your scatter 3D plot:
library(plotly)
library(dplyr)
theta <- 2*pi * runif(1000)
phi <- pi * runif(1000)
x <- sin(phi) * cos(theta)
y <- sin(phi) * sin(theta)
z <- cos(phi)
dat <- data.frame(x, y, z)
- Generate a scatter plot with (x, y, z) coordinates, just computed. What do you observe?
plot_ly(dat, x = ~x, y = ~y, z = ~z,
type = "scatter3d", mode = "markers", marker = list(size = 3))
- Now generate new points as follows. And use
plotly to create a 3D scatter point plot and a separate line plot. Color the points by their ordering in the data-frame.
N <- 10
theta <- rep(2*pi * seq(0, 1, length.out = 100), N)
phi <- rep(pi * seq(0, 1, length.out = N*100))
x <- sin(phi) * cos(theta)
y <- sin(phi) * sin(theta)
z <- cos(phi)
dat <- data.frame(x, y, z)
plot_ly(dat, x = ~x, y = ~y, z = ~z, color = 1:1000) %>%
add_markers(marker = list(size = 2))
plot_ly(dat, x = ~x, y = ~y, z = ~z, color = 1:1000, type = "scatter3d",
mode = "lines", line = list(width = 3))
Exercise 2: heatmaps
How common is your birthday? Download the following data which includes the records of birthdays on each day of a month in the US between 2000 and 2014. The code below aggregates the data across years to count the number of birthdays on each day and each the month. Plot a heatmap of bdays.wide to see whether your birthday is among more popular dates. Note that you should ise settings not to plot dendrograms, as the rows and columns have their ordering already (according time) and do not need to be clusteres.
#install.packages("tidyr")
bdays <- read.csv("https://raw.githubusercontent.com/fivethirtyeight/data/master/births/US_births_2000-2014_SSA.csv")
head(bdays)
dim(bdays)
[1] 5479 5
bdays.wide <- bdays %>%
group_by(date_of_month, month) %>%
summarize(births = sum(births)) %>%
tidyr::spread(key = "date_of_month", value = "births")
rownames(bdays.wide) <- bdays.wide$month
Setting row names on a tibble is deprecated.
bdays.wide$month <- NULL
head(bdays.wide)
dim(bdays.wide)
[1] 12 31
library(RColorBrewer)
redblues <- colorRampPalette(colors = brewer.pal(9, "RdBu"))(10)
heatmap(as.matrix(bdays.wide), Colv = NA, Rowv = NA, col = redblues)

https://www2.warwick.ac.uk/fac/sci/moac/people/students/peter_cock/r/heatmap/
Exercise 3: Plotting maps
- Use
ggmap to generate a map of South America, for your conveniences the location can be set as the bounding box: c(-85, -58, -30, 15) Choose “stamen” as your source, and “terrain” as your maptype.
library(ggmap)
south_america <- get_map(location = c(-85, -58, -30, 15),
source = "stamen", maptype = "toner-lite",
crop = TRUE)
ggmap(south_america)

- Use
ggmap to plot on the same map your house/apartment/dorm and Stanford Main Quad. Add a path from your house to Stanford (can be in straight line).

LS0tCnRpdGxlOiAiTGVjdHVyZSA1OiBFeGVyY2lzZXMgd2l0aCBhbnN3ZXJzIgpkYXRlOiBPY3RvYmVyIDE3dGgsIDIwMTcKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKLS0tCgoKCiMgRXhlcmNpc2UgMTogYHBsb3RseWAKCkZpcnN0IGdlbmVyYXRlIHRoZSBmb2xsb3dpbmcgKHgseSx6KSBjb29yZGluYXRlcyBmb3IgeW91ciBzY2F0dGVyIDNEIHBsb3Q6CmBgYHtyfQpsaWJyYXJ5KHBsb3RseSkKbGlicmFyeShkcGx5cikKCnRoZXRhIDwtIDIqcGkgKiBydW5pZigxMDAwKQpwaGkgPC0gcGkgKiBydW5pZigxMDAwKQp4IDwtIHNpbihwaGkpICogY29zKHRoZXRhKQp5IDwtIHNpbihwaGkpICogc2luKHRoZXRhKQp6IDwtIGNvcyhwaGkpCmRhdCA8LSBkYXRhLmZyYW1lKHgsIHksIHopCmBgYAoKYS4gR2VuZXJhdGUgYSBzY2F0dGVyIHBsb3Qgd2l0aCAoeCwgeSwgeikgY29vcmRpbmF0ZXMsIGp1c3QgY29tcHV0ZWQuIFdoYXQgZG8KeW91IG9ic2VydmU/CgpgYGB7cn0KcGxvdF9seShkYXQsIHggPSB+eCwgeSA9IH55LCB6ID0gfnosCiAgICAgICAgdHlwZSA9ICJzY2F0dGVyM2QiLCBtb2RlID0gIm1hcmtlcnMiLCBtYXJrZXIgPSBsaXN0KHNpemUgPSAzKSkKYGBgCgpiLiBOb3cgZ2VuZXJhdGUgbmV3IHBvaW50cyBhcyBmb2xsb3dzLiBBbmQgdXNlIGBwbG90bHlgIHRvIGNyZWF0ZSBhIDNEIApzY2F0dGVyIHBvaW50IHBsb3QgYW5kIGEgc2VwYXJhdGUgbGluZSBwbG90LiBDb2xvciB0aGUgcG9pbnRzIGJ5CnRoZWlyIG9yZGVyaW5nIGluIHRoZSBkYXRhLWZyYW1lLgoKYGBge3J9Ck4gPC0gMTAKdGhldGEgPC0gcmVwKDIqcGkgKiBzZXEoMCwgMSwgbGVuZ3RoLm91dCA9IDEwMCksIE4pCnBoaSA8LSByZXAocGkgKiBzZXEoMCwgMSwgbGVuZ3RoLm91dCA9IE4qMTAwKSkKeCA8LSBzaW4ocGhpKSAqIGNvcyh0aGV0YSkKeSA8LSBzaW4ocGhpKSAqIHNpbih0aGV0YSkKeiA8LSBjb3MocGhpKQpkYXQgPC0gZGF0YS5mcmFtZSh4LCB5LCB6KQpgYGAKCgpgYGB7cn0KcGxvdF9seShkYXQsIHggPSB+eCwgeSA9IH55LCB6ID0gfnosIGNvbG9yID0gMToxMDAwKSAlPiUKICBhZGRfbWFya2VycyhtYXJrZXIgPSBsaXN0KHNpemUgPSAyKSkKYGBgCgpgYGB7cn0KcGxvdF9seShkYXQsIHggPSB+eCwgeSA9IH55LCB6ID0gfnosIGNvbG9yID0gMToxMDAwLCB0eXBlID0gInNjYXR0ZXIzZCIsIAogICAgICAgIG1vZGUgPSAibGluZXMiLCBsaW5lID0gbGlzdCh3aWR0aCA9IDMpKQpgYGAKCgojIEV4ZXJjaXNlIDI6IGhlYXRtYXBzCgpIb3cgY29tbW9uIGlzIHlvdXIgYmlydGhkYXk/IERvd25sb2FkIHRoZSBmb2xsb3dpbmcgZGF0YSB3aGljaCBpbmNsdWRlcwp0aGUgcmVjb3JkcyBvZiBiaXJ0aGRheXMgb24gZWFjaCBkYXkgb2YgYSBtb250aCBpbiB0aGUgVVMgYmV0d2VlbiAyMDAwIGFuZCAyMDE0LiAKVGhlIGNvZGUgYmVsb3cgYWdncmVnYXRlcyB0aGUgZGF0YSBhY3Jvc3MgeWVhcnMgdG8gY291bnQgdGhlIG51bWJlciBvZiAKYmlydGhkYXlzIG9uIGVhY2ggZGF5IGFuZCBlYWNoIHRoZSBtb250aC4gUGxvdCBhIGhlYXRtYXAgb2YgYGJkYXlzLndpZGVgCnRvIHNlZSB3aGV0aGVyIHlvdXIgYmlydGhkYXkgaXMgYW1vbmcgbW9yZSBwb3B1bGFyIGRhdGVzLiBOb3RlIHRoYXQKeW91IHNob3VsZCBpc2Ugc2V0dGluZ3Mgbm90IHRvIHBsb3QgZGVuZHJvZ3JhbXMsIGFzIHRoZSByb3dzIGFuZCBjb2x1bW5zCmhhdmUgdGhlaXIgb3JkZXJpbmcgYWxyZWFkeSAoYWNjb3JkaW5nIHRpbWUpIGFuZCBkbyBub3QgbmVlZCB0byBiZSBjbHVzdGVyZXMuCgpgYGB7cn0KI2luc3RhbGwucGFja2FnZXMoInRpZHlyIikKYmRheXMgPC0gcmVhZC5jc3YoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9maXZldGhpcnR5ZWlnaHQvZGF0YS9tYXN0ZXIvYmlydGhzL1VTX2JpcnRoc18yMDAwLTIwMTRfU1NBLmNzdiIpCmhlYWQoYmRheXMpCmRpbShiZGF5cykKYmRheXMud2lkZSA8LSBiZGF5cyAlPiUgCiAgZ3JvdXBfYnkoZGF0ZV9vZl9tb250aCwgbW9udGgpICU+JQogIHN1bW1hcml6ZShiaXJ0aHMgPSBzdW0oYmlydGhzKSkgJT4lCiAgdGlkeXI6OnNwcmVhZChrZXkgPSAiZGF0ZV9vZl9tb250aCIsIHZhbHVlID0gImJpcnRocyIpIApyb3duYW1lcyhiZGF5cy53aWRlKSA8LSBiZGF5cy53aWRlJG1vbnRoCmJkYXlzLndpZGUkbW9udGggPC0gTlVMTApoZWFkKGJkYXlzLndpZGUpCmRpbShiZGF5cy53aWRlKQpgYGAKCmBgYHtyfQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKcmVkYmx1ZXMgPC0gY29sb3JSYW1wUGFsZXR0ZShjb2xvcnMgPSBicmV3ZXIucGFsKDksICJSZEJ1IikpKDEwKQpoZWF0bWFwKGFzLm1hdHJpeChiZGF5cy53aWRlKSwgQ29sdiA9IE5BLCBSb3d2ID0gTkEsIGNvbCA9IHJlZGJsdWVzKSAKYGBgCgoKaHR0cHM6Ly93d3cyLndhcndpY2suYWMudWsvZmFjL3NjaS9tb2FjL3Blb3BsZS9zdHVkZW50cy9wZXRlcl9jb2NrL3IvaGVhdG1hcC8KCiMgRXhlcmNpc2UgMzogUGxvdHRpbmcgbWFwcwoKYS4gVXNlIGBnZ21hcGAgdG8gZ2VuZXJhdGUgYSBtYXAgb2YgU291dGggQW1lcmljYSwgZm9yIHlvdXIgY29udmVuaWVuY2VzCnRoZSBsb2NhdGlvbiBjYW4gYmUgc2V0IGFzIHRoZSBib3VuZGluZyBib3g6CmBjKC04NSwgLTU4LCAtMzAsIDE1KWAKQ2hvb3NlICJzdGFtZW4iIGFzIHlvdXIgc291cmNlLCBhbmQgInRlcnJhaW4iIGFzIHlvdXIgbWFwdHlwZS4KCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsaWJyYXJ5KGdnbWFwKQpzb3V0aF9hbWVyaWNhIDwtIGdldF9tYXAobG9jYXRpb24gPSBjKC04NSwgLTU4LCAtMzAsIDE1KSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPSAic3RhbWVuIiwgbWFwdHlwZSA9ICJ0b25lci1saXRlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICBjcm9wID0gVFJVRSkKZ2dtYXAoc291dGhfYW1lcmljYSkKYGBgCgoKYi4gVXNlIGBnZ21hcGAgdG8gcGxvdCBvbiB0aGUgc2FtZSBtYXAgeW91ciBob3VzZS9hcGFydG1lbnQvZG9ybSBhbmQgU3RhbmZvcmQgTWFpbiBRdWFkLgpBZGQgYSBwYXRoIGZyb20geW91ciBob3VzZSB0byBTdGFuZm9yZCAoY2FuIGJlIGluIHN0cmFpZ2h0IGxpbmUpLgoKYGBge3J9CnN0YW5mb3JkIDwtIGdlb2NvZGUoIlN0YW5mb3JkIFVuaXZlcnNpdHkiKSAKbG9jIDwtIGdlb2NvZGUoIjU0NyBFbWVyc29uIFN0LCBQYWxvIEFsdG8iKQoKcm9hZCA8LSBkYXRhLmZyYW1lKGxhdGl0dWRlID0gc2VxKHN0YW5mb3JkJGxhdCwgbG9jJGxhdCwgbGVuZ3RoLm91dCA9NTApLAogICAgICAgICAgICAgICAgICAgbG9uZ2l0dWRlID0gc2VxKHN0YW5mb3JkJGxvbiwgbG9jJGxvbiwgbGVuZ3RoLm91dCA9IDUwKSkKCm15TWFwIDwtIGdldF9tYXAobG9jYXRpb24gPSBjKHN0YW5mb3JkJGxvbiwgc3RhbmZvcmQkbGF0LCBsb2MkbG9uLCBsb2MkbGF0KSwgCiAgICAgICAgICAgICAgICAgem9vbSA9IDE1KQpnZ21hcChteU1hcCkgKyAKICBnZW9tX3BhdGgoZGF0YSA9IHJvYWQsIGFlcyh4ID0gbG9uZ2l0dWRlLCB5ID0gbGF0aXR1ZGUpLCAKICAgICAgICAgICAgIHNpemUgPSAyLCBjb2xvciA9ICJkYXJrcmVkIikKYGBgCgoK